package com.ruoyi.common.file;

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class Replace_file {
    public static void main(String[] args) {
        Path sourceDir = Paths.get("E:/code/gen/main");
        Path targetDir = Paths.get("E:\\code\\exam-baby\\exam-baby-backend\\exam-baby\\src\\main");

        try {
            copyDirectory(sourceDir, targetDir);
            System.out.println("目录复制完成");
        } catch (IOException e) {
            System.err.println("复制失败: " + e.getMessage());
        }
    }

    /**
     * 递归复制目录结构及文件（覆盖模式）
     * @param sourceDir 源目录
     * @param targetDir 目标目录
     * @throws IOException 文件操作异常
     */
    public static void copyDirectory(Path sourceDir, Path targetDir) throws IOException {
        // 校验源目录是否存在
        if (!Files.exists(sourceDir) || !Files.isDirectory(sourceDir)) {
            throw new IllegalArgumentException("无效的源目录: " + sourceDir);
        }

        // 创建目标根目录（如果不存在）
        Files.createDirectories(targetDir);

        // 使用Files.walkFileTree进行递归遍历
        Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                // 计算相对路径
                Path relativePath = sourceDir.relativize(dir);
                Path targetPath = targetDir.resolve(relativePath);

                // 创建目标目录（如果不存在）
                if (!Files.exists(targetPath)) {
                    Files.createDirectories(targetPath);
                    System.out.println("创建目录: " + targetPath);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                // 计算目标路径
                Path relativePath = sourceDir.relativize(file);
                Path targetPath = targetDir.resolve(relativePath);

                // 复制文件（覆盖模式）
                Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);
                System.out.println("复制文件: " + targetPath);
                return FileVisitResult.CONTINUE;
            }
        });
    }
}
